home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 January / enter-2004-01.iso / files / maxima-5.9.0.exe / {app} / share / maxima / 5.9.0 / src / newdet.lisp < prev    next >
Encoding:
Text File  |  2003-02-09  |  5.1 KB  |  181 lines

  1. ;;; -*-  Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;     The data in this file contains enhancments.                    ;;;;;
  4. ;;;                                                                    ;;;;;
  5. ;;;  Copyright (c) 1984,1987 by William Schelter,University of Texas   ;;;;;
  6. ;;;     All rights reserved                                            ;;;;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. ;;;     (c) Copyright 1980 Massachusetts Institute of Technology         ;;;
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.  
  11. (in-package "MAXIMA")
  12. (macsyma-module newdet)
  13.  
  14. ;; THIS IS A VERSION OF THE GENTLEMAN-JOHNSON TREE-MINOR DETERMINANT
  15. ;; USING RATIONAL FUNCTIONS.  "A" CAN BE A MATRIX OR AN ARRAY.
  16. ;; ANSWER IS IN RATIONAL FORM.
  17. ;; RJF  5/2/73
  18.  
  19. (DECLARE-TOP(SPECIAL VLIST VARLIST GENVAR ARYP)
  20.      #-cl
  21.      (FIXNUM RR K J OLD NEW *BINOM* *i* PASCAL N M))
  22. ;     (ARRAY* (NOTYPE *INPUT* 2 *BINOM* 2 *MINOR1* 2 *i* 1)
  23.  
  24. ;;these are general type arrays
  25. (declare-top  (special *INPUT*  *BINOM*  *MINOR1*  *i* ))
  26.  
  27. (DEFMFUN $NEWDET N
  28.        ((LAMBDA (A)
  29.         (COND ((= N 2)
  30.                (COND ((NOT (INTEGERP (ARG 2)))
  31.                   (merror "Wrong arg to NEWDET: ~M" (ARG 2))))
  32.                (SETQ A (ARG 1) N (ARG 2)))
  33.               ((AND (= N 1) ($MATRIXP (SETQ A (ARG 1))))
  34.                (SETQ N (LENGTH (CDR (ARG 1)))))
  35.               (T (merror "Wrong number of args to NEWDET")))
  36.         (NEWDET A N NIL))
  37.     NIL))
  38.  
  39. (DEFMFUN $PERMANENT N        
  40.        ((LAMBDA (A)
  41.         (COND ((= N 2)
  42.                (COND ((NOT (INTEGERP (ARG 2)))
  43.                   (merror "Wrong arg to PERM: ~M" (ARG 2))))
  44.                (SETQ A (ARG 1) N (ARG 2)))
  45.               ((AND (= N 1) ($MATRIXP (SETQ A (ARG 1))))
  46.                (SETQ N (LENGTH (CDR (ARG 1)))))
  47.               (T (merror "Wrong number of args to PERM")))
  48.         (NEWDET A N T))
  49.     NIL))
  50.  
  51. (DEFUN NEWDET (A N PERM)
  52.   (PROG (RR R K J OLD NEW VLIST M LOC ADDR SIGN) 
  53.     (COND ((> N 50.)
  54.            (merror "Array too big - NEWDET: ~M" N)))
  55.     (setq  *BINOM* (*ARRAY nil T (ADD1 N) (ADD1 N)))
  56.     (setq  *MINOR1* (*ARRAY nil T 2. (ADD1 (SETQ RR (PASCAL N)))))
  57.     (setq  *i* (*ARRAY nil T (PLUS 2. N)))
  58.     (DO ((K
  59.         0.
  60.       (ADD1 K)))
  61.       ((> K 1.))
  62.       (DO ((J
  63.           0.
  64.         (ADD1 J)))
  65.         ((> J RR))
  66.         (STORE (aref *MINOR1* K J) '(0. . 1.))))
  67.     (DO ((K 0. (ADD1 K))) ((> K (ADD1 N))) (STORE (aref *i* K) -1.))
  68.     (setq  *INPUT* (*ARRAY nil T (ADD1 N) (ADD1 N)))
  69.     (DO ((K
  70.         1.
  71.       (ADD1 K)))
  72.       ((> K N))
  73.       (DO ((J
  74.           1.
  75.         (ADD1 J)))
  76.         ((> J N))
  77.         (NEWVAR1 (STORE (aref *INPUT* K J)
  78.                 ((LAMBDA (ARYP)
  79.                    #+cl
  80.                    (maref a k j)
  81.                    #-cl
  82.                    (MEVAL (LIST (LIST A 'array) K J))
  83.                    )
  84.                  T)))))
  85.     (NEWVAR (CONS '(MTIMES) VLIST))
  86.     (DO ((K
  87.         1.
  88.       (ADD1 K)))
  89.       ((> K N))
  90.       (DO ((J
  91.           1.
  92.         (ADD1 J)))
  93.         ((> J N))
  94.         (STORE (aref *INPUT* K J)
  95.            (CDR (RATREP* (aref *INPUT* K J))))))
  96.     (SETQ NEW 1.)
  97.     (SETQ OLD 0.)
  98.     (STORE (aref *i* 0.) N)
  99.     (DO ((LOC
  100.         1.
  101.       (ADD1 LOC)))
  102.       ((> LOC N))
  103.       (STORE (aref *MINOR1* OLD (SUB1 LOC)) (aref *INPUT* 1. LOC)))
  104.     (SETQ M 1.)
  105.      G0193(COND ((> M (SUB1 N)) (GO RET)))
  106.     (SETQ LOC 0.)
  107.     (SETQ J 1.)
  108.      G0189(COND ((> J M) (GO NEXTMINOR)))
  109.     (STORE (aref *i* J) (DIFFERENCE M J))
  110.     (SETQ J (f+ J 1.))
  111.     (GO G0189)
  112.      NEXTMINOR
  113.     (COND ((NOT (EQUAL (aref *MINOR1* OLD LOC) '(0. . 1.)))
  114.            (SETQ K (SUB1 N))
  115.            (SETQ J 0.)
  116.            (SETQ ADDR (PLUS LOC (aref *BINOM* K (ADD1 M))))
  117.            (SETQ SIGN 1.))
  118.           (T (GO OVER)))
  119.      NEXTUSE
  120.     (COND
  121.       ((EQUAL K (aref *i* (ADD1 J)))
  122.        (SETQ J (ADD1 J))
  123.        (SETQ SIGN (MINUS SIGN)))
  124.       (T
  125.        (STORE
  126.          (aref *MINOR1* NEW ADDR)
  127.          (RATPLUS
  128.            (aref *MINOR1* NEW ADDR)
  129.            (RATTIMES (aref *MINOR1* OLD LOC)
  130.              (COND ((OR (EQUAL SIGN 1.) PERM)
  131.                 (aref *INPUT* (ADD1 M) (ADD1 K)))
  132.                    (T (RATMINUS (aref *INPUT* (ADD1 M)
  133.                           (ADD1 K)))))
  134.              T)))))
  135.     (COND ((> K 0.)
  136.            (SETQ K (SUB1 K))
  137.            (SETQ ADDR
  138.              (DIFFERENCE ADDR
  139.                  (aref *BINOM* K (DIFFERENCE M J))))
  140.            (GO NEXTUSE)))
  141.     (STORE (aref *MINOR1* OLD LOC)  '(0 . 1))
  142.      OVER (SETQ LOC (ADD1 LOC))
  143.     (SETQ J M)
  144.      BACK (COND ((> 1. J) (SETQ M (ADD1 M))(SETQ OLD(DIFFERENCE 1 OLD))(SETQ NEW (DIFFERENCE 1 NEW))(GO G0193)))
  145.     (STORE (aref *i* J) (ADD1 (aref *i* J)))
  146.     (COND ((> (aref *i* (SUB1 J)) (aref *i* J)) (GO NEXTMINOR))
  147.           (T (STORE (aref *i* J) (DIFFERENCE M J))))
  148.     
  149.     (SETQ J (SUB1 J))
  150.     (GO BACK)
  151.      RET(*REARRAY '*BINOM*)
  152.     (*REARRAY '*INPUT*)
  153.     (SETQ R (CONS (LIST 'MRAT
  154.                 'SIMP
  155.                 VARLIST
  156.                 GENVAR)
  157.               (aref *MINOR1* OLD 0.)))
  158.     (*REARRAY '*MINOR1*)
  159.     (RETURN R)))
  160.  
  161. (DEFUN PASCAL (N) 
  162.        (PROG NIL 
  163.          (STORE (aref *BINOM* 0. 0.) 1.)
  164.          (DO ((H
  165.          1.
  166.          (ADD1 H)))
  167.          ((> H N))
  168.          (STORE (aref *BINOM* H 0.) 1.)
  169.          (STORE (aref *BINOM* (SUB1 H) H) 0.)
  170.          (DO ((J
  171.              1.
  172.              (ADD1 J)))
  173.              ((> J H))
  174.              (STORE (aref *BINOM* H J)
  175.                 (PLUS (aref *BINOM* (SUB1 H) (SUB1 J))
  176.                   (aref *BINOM* (SUB1 H) J)))))
  177.          (RETURN (SUB1 (aref *BINOM* N (LSH N -1.))))))
  178.  
  179. ;;these need to be special in so many places please dont unspecial them..
  180. ;;(DECLARE (UNSPECIAL VLIST VARLIST GENVAR ARYP))
  181.